package org.Yiran.timetale_re.sound;

import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
import org.Yiran.timetale_re.Timetale_re;

/**
 * 模组音效注册类
 * <p>
 * 该类负责注册和管理模组中使用的所有自定义音效事件。
 * 使用Minecraft Forge的延迟注册系统来注册音效，确保与游戏生命周期正确集成。
 * </p>
 * 
 * @author Yiran
 * @version 1.0
 */
public class ModSounds {
    
    // ================================ 音效注册器 ================================
    
    /**
     * 音效事件的延迟注册器
     * <p>
     * 使用Forge的DeferredRegister系统来管理SoundEvent的注册，
     * 确保在正确的时机进行注册，避免游戏启动时出现问题。
     * </p>
     */
    public static final DeferredRegister<SoundEvent> SOUNDS =
            DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, Timetale_re.MODID);

    // ================================ 水晶方块音效 ================================
    
    /**
     * 水晶方块破坏音效
     * <p>
     * 当玩家破坏水晶方块时播放的音效事件。
     * 音效文件路径: resources/assets/timetale_re/sounds/block/crystal/break.ogg
     * </p>
     */
    public static final RegistryObject<SoundEvent> CRYSTAL_BREAK = SOUNDS.register("block.crystal.break",
            () -> SoundEvent.createVariableRangeEvent(ResourceLocation.fromNamespaceAndPath(Timetale_re.MODID, "block.crystal.break")));

    /**
     * 水晶方块放置音效
     * <p>
     * 当玩家放置水晶方块时播放的音效事件。
     * 音效文件路径: resources/assets/timetale_re/sounds/block/crystal/place.ogg
     * </p>
     */
    public static final RegistryObject<SoundEvent> CRYSTAL_PLACE = SOUNDS.register("block.crystal.place",
            () -> SoundEvent.createVariableRangeEvent(ResourceLocation.fromNamespaceAndPath(Timetale_re.MODID, "block.crystal.place")));

    /**
     * 水晶方块步行音效
     * <p>
     * 当玩家在水晶方块上行走时播放的音效事件。
     * 音效文件路径: resources/assets/timetale_re/sounds/block/crystal/step.ogg
     * </p>
     */
    public static final RegistryObject<SoundEvent> CRYSTAL_STEP = SOUNDS.register("block.crystal.step",
            () -> SoundEvent.createVariableRangeEvent(ResourceLocation.fromNamespaceAndPath(Timetale_re.MODID, "block.crystal.step")));

    /**
     * 水晶方块击打音效
     * <p>
     * 当玩家攻击或挖掘水晶方块时播放的音效事件。
     * 音效文件路径: resources/assets/timetale_re/sounds/block/crystal/hit.ogg
     * </p>
     */
    public static final RegistryObject<SoundEvent> CRYSTAL_HIT = SOUNDS.register("block.crystal.hit",
            () -> SoundEvent.createVariableRangeEvent(ResourceLocation.fromNamespaceAndPath(Timetale_re.MODID, "block.crystal.hit")));

    /**
     * 水晶方块坠落音效
     * <p>
     * 当实体在水晶方块上坠落时播放的音效事件。
     * 音效文件路径: resources/assets/timetale_re/sounds/block/crystal/fall.ogg
     * </p>
     */
    public static final RegistryObject<SoundEvent> CRYSTAL_FALL = SOUNDS.register("block.crystal.fall",
            () -> SoundEvent.createVariableRangeEvent(ResourceLocation.fromNamespaceAndPath(Timetale_re.MODID, "block.crystal.fall")));

    // ================================ 注册方法 ================================
    
    /**
     * 注册所有音效事件到游戏事件总线
     * <p>
     * 将音效注册器绑定到Forge事件总线，使所有已定义的音效事件能够被游戏识别和使用。
     * 通常在模组主类的构造函数中调用此方法。
     * </p>
     * 
     * @param eventBus Forge事件总线实例
     */
    public static void register(IEventBus eventBus) {
        SOUNDS.register(eventBus);
    }
}